package cn.itcast.nems.oldems.service.sync;

import cn.itcast.nems.oldems.dto.MergeStudentReason;
import cn.itcast.nems.oldems.dto.Refund;
import cn.itcast.nems.oldems.dto.StudentRecordCirculation;
import cn.itcast.nems.oldems.dto.oldapi.EmsApiResult;
import cn.itcast.nems.studentrecord.dto.studentrecord.StudentRecordFundFlowDTO;
import cn.itcast.nems.studentrecord.dto.studentrecord.StudentRecordFundFlowInfoDTO;
import org.springframework.lang.NonNull;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 同步到老EMS接口
 * author: yong.li
 * create: 2024-03-13 17:35:29
 **/
public interface OldEmsSyncService {

    /**
     * 同步老EMS开关是否开启
     *
     * @return 开: true 关: false
     */
    boolean isSyncOn();

    /**
     * 将新EMS学籍流转信息，同步到老EMS；仅针对2个学籍的流转，如：转班、重读、升级、休学归来（注意：“休学归来”的原学籍是休学班之前的确定班学籍）
     *
     * @param studentRecordCirculations 参数对象
     * @return 同步老EMS结果
     */
    EmsApiResult circulations(List<StudentRecordCirculation> studentRecordCirculations);

    /**
     * 休学
     *
     * @param studentId     学员ID
     * @param clazzId       班级ID
     * @param suspendDate   休学日期
     * @param operatorEmail 操作者ID
     * @return 同步老EMS结果
     */
    EmsApiResult suspension(Integer studentId, Integer clazzId, LocalDate suspendDate, String operatorEmail);

    /**
     * 退费
     *
     * @param refund
     * @param loginUser
     * @return
     */
    EmsApiResult refund(Refund refund, String loginUser);

    /**
     * 退学
     *
     * @param studentRecordId 学籍id
     * @param bizDate         退学日期, 格式:yyyy-MM-dd
     * @param type            退费类型;枚举值：退学不退费｜、退学退费｜
     * @return
     */
    EmsApiResult dropout(String studentRecordId, LocalDate bizDate, String type, String loginUser);

    /**
     * 费用转移
     *
     * @param originStudentRecordId 原学籍ID
     * @param targetStudentRecordId 目标学籍ID
     * @param originChannelType     原渠道是否为多渠道, 默认false,
     * @param paychannel            付款渠道ID, PaymentChannel表ID
     * @param type                  默认1, 1: 学费转学费, 4: 押金转押金
     * @return
     */
    EmsApiResult fundTransfer(String originStudentRecordId, String targetStudentRecordId, Boolean originChannelType, String paychannel, String type, String loginUser, String originChannelCode, Integer transferAmount);

    /**
     * 费用转移, 转班凭单使用
     *
     * @param originStudentRecordId 原学籍ID
     * @param targetStudentRecordId 目标学籍ID
     * @param originChannelType     原渠道是否为多渠道, 默认false,
     * @param paychannel            付款渠道ID, PaymentChannel表ID
     * @param type                  默认1, 1: 学费转学费, 4: 押金转押金
     * @return
     */
    EmsApiResult fundTransferByTransfer(String originStudentRecordId, String targetStudentRecordId, Boolean originChannelType, String paychannel, String type, String loginUser, String originChannelCode, Integer transferAmount);

    /**
     * 补录流水
     *
     * @return
     */
    EmsApiResult fundFlow(StudentRecordFundFlowInfoDTO studentRecordFundFlowInfoDO, StudentRecordFundFlowDTO result, BigDecimal amount, String schoolCode, String paymentAccountCode, LocalDateTime dateTime, BigDecimal charge);

    /**
     * 校验并获取老EMS学籍ID
     *
     * @param studentRecordId 新EMS学籍ID
     * @return java.lang.Integer 老EMS学籍ID
     * @author 高昌露
     * @since 2024/3/25 9:21
     */
    Integer checkAndGetOldEmsSJcId(@NonNull String studentRecordId);

    /**
     * 调整老EMS应交价格
     *
     * @param studentRecordId 新EMS学籍ID
     * @param price           调整价格(单位:分)
     * @param loginUser       操作人
     * @return cn.itcast.nems.oldems.dto.oldapi.EmsApiResult
     * @author 高昌露
     * @since 2024/3/19 10:26
     */
    EmsApiResult adjustPrice(String studentRecordId, Integer price, String loginUser);


    /**
     * 合并学员
     *
     * @param fromStudentId 被合并的学员
     * @param toStudentId   合并后保留下来的学员
     * @param reason        合并原因
     * @param operatorEmail 操作者ID
     * @return 同步老EMS结果
     */
    EmsApiResult mergeStudent(Integer fromStudentId, Integer toStudentId, MergeStudentReason reason, String operatorEmail);

    EmsApiResult suspensionReturn(Integer sjcId, String loginUser);
}
